//
//  luoerUserAccountViewModel.swift
//  WeiBoStudy
//
//  Created by luoerliu on 16/5/14.
//  Copyright © 2016年 刘文平. All rights reserved.
//

import UIKit

class luoerUserAccountViewModel: NSObject {
//创建一个单例
    static let sharedinstance:luoerUserAccountViewModel = luoerUserAccountViewModel()
    //                        设置保存的路径
    let userAccountPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! + "/account.plist"
        var userAccount:luoerUserAccount?
//    用户是否登录的属性
    var isUserLogin: Bool{
        get{
//        如果账号不是空的表示已经登录
             return  userAccount != nil
        }}
//    重写这个类的init方法 让外界每次调用的时候都从沙盒中解档
    override init() {
        super.init()
        
        // 加载沙盒里面的账号,赋值给userAccount, 只需要加载一次
        userAccount = loadUserAccount()
    }
    func loadAccessToken(code: String, callback: (error:NSError?) -> ())
    {
        //                发送POST请求
        let urlString = "oauth2/access_token"
        
        // 参数
        let parameters = [
            "client_id" : client_id,
            "client_secret" : client_secret,
            "grant_type" : "authorization_code",
            "code" : code,
            "redirect_uri": redirect_uri
        ]
        luoerNetworkTool.sharedInstance.request(RequestMethod.POST, URLString: urlString, parameters: parameters, success: { (task , respondsObject) -> Void in
            print("获取AccessToken成功:\(respondsObject)")
            //                    字典转模型
            if let result = respondsObject as? [String: AnyObject]
            {
                let userAccount = luoerUserAccount(dict: result)
//                将账号赋值给属性
                self.userAccount = userAccount
                // 调用归档的方法,将模型归档到沙盒里面
                self.saveUserAccount()
//                告诉控制器转模型操作完成，进行下一个操作
                callback(error: nil)
            }
            else
            {
                print("转模型失败")
            }
            }, failure: { (task , error ) -> Void in
                print("获取AccessToken失败")
                callback(error: error)
        })
    }
//    保存账号到沙盒
    private func saveUserAccount()
    {
        if let account = userAccount
        {
             NSKeyedArchiver.archiveRootObject(account, toFile: self.userAccountPath)
        }
    }
//    解档账号
    func loadUserAccount() ->luoerUserAccount?
{
//    判断账号有效期是否过期
    // 解档对象
    if let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(self.userAccountPath) as? luoerUserAccount{
        // 加载到了账号, 判断是否过期
        if userAccount.expiresDate?.compare(NSDate()) != NSComparisonResult.OrderedAscending {
            // 没有过期
            return userAccount
        } else {
            return nil
        }
    } else {
        // 没有加载出账号
        return nil
    }
}
    // MARK: - 获取用户名称和头像
    /**
    加载用户信息,用户名称和头像
    */
    func loadUserInfo(loadUserInfoCallback: () -> ()) {
        // 可选绑定会造成嵌套层次很多, swift提供了另外一种形式,守卫 guard
        // guard正好相反
        guard let access_token = userAccount?.access_token else {
            // 能到里面来说明access_token没有值
            return
        }
        // access_token有值可以在后面继续使用
        
        guard let uid = userAccount?.uid else {
            // 能到这里面来说明uid没有值
            return
        }
        // uid有值,可以在后面使用uid
        
        // urlString
        let urlString = "2/users/show.json"
        
        // 参数
        let parameters = [
            "access_token": access_token,
            "uid": uid
        ]
        
        // 发送请求
       luoerNetworkTool.sharedInstance.request(RequestMethod.GET, URLString: urlString, parameters: parameters, success: { (_, responseObject) -> Void in
            //            CZPrint(items: "获取用户信息: \(responseObject)")
            if let result = responseObject as? [String: AnyObject] {
                // 只需要用户的名称和头像地址
                let screen_name = result["screen_name"] as? String
                
                let avatar_large = result["avatar_large"] as? String
                
                // 赋值到当前账号的模型中
                self.userAccount?.screen_name = screen_name
                self.userAccount?.avatar_large = avatar_large
                
                // 将userAccount保存到沙盒中
                self.saveUserAccount()
                
                // 让欢迎界面显示信息, 通过闭包回调
                loadUserInfoCallback()
            }
            }) { (_, error) -> Void in
                print("加载用户信息出错")
        }
    }
}